{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "cvae.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "metadata": {
        "id": "Ndo4ERqnwQOU",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "##### Copyright 2018 The TensorFlow Authors."
      ]
    },
    {
      "metadata": {
        "id": "MTKwbguKwT4R",
        "colab_type": "code",
        "colab": {},
        "cellView": "form"
      },
      "cell_type": "code",
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "xfNT-mlFwxVM",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Convolutional Variational Autoencoder"
      ]
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "0TD5ZrvEMbhZ"
      },
      "cell_type": "markdown",
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/alpha/tutorials/generative/cvae\">\n",
        "    <img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />\n",
        "    View on TensorFlow.org</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/cvae.ipynb\">\n",
        "    <img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />\n",
        "    Run in Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/cvae.ipynb\">\n",
        "    <img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />\n",
        "    View source on GitHub</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "ITZuApL56Mny"
      },
      "cell_type": "markdown",
      "source": [
        "![evolution of output during training](https://tensorflow.org/images/autoencoders/cvae.gif)\n",
        "\n",
        "This notebook demonstrates how to generate images of handwritten digits by training a Variational Autoencoder ([1](https://arxiv.org/abs/1312.6114), [2](https://arxiv.org/abs/1401.4082)).\n",
        "\n"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "P-JuIu2N_SQf",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# to generate gifs\n",
        "!pip install imageio"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "e1_Y75QXJS6h"
      },
      "cell_type": "markdown",
      "source": [
        "## Import TensorFlow and other libraries"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "YfIk2es3hJEd",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from __future__ import absolute_import, division, print_function\n",
        "\n",
        "!pip install tensorflow-gpu==2.0.0-alpha0\n",
        "import tensorflow as tf\n",
        "\n",
        "import os\n",
        "import time\n",
        "import numpy as np\n",
        "import glob\n",
        "import matplotlib.pyplot as plt\n",
        "import PIL\n",
        "import imageio\n",
        "\n",
        "from IPython import display"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "iYn4MdZnKCey"
      },
      "cell_type": "markdown",
      "source": [
        "## Load the MNIST dataset\n",
        "Each MNIST image is originally a vector of 784 integers, each of which is between 0-255 and represents the intensity of a pixel. We model each pixel with a Bernoulli distribution in our model, and we statically binarize the dataset."
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "a4fYMGxGhrna",
        "outputId": "d049d5c6-d1b7-4a41-eece-e4e55857bd2b",
        "colab": {
          "height": 71
        }
      },
      "cell_type": "code",
      "source": [
        "(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n",
            "11493376/11490434 [==============================] - 0s 0us/step\n",
            "11501568/11490434 [==============================] - 0s 0us/step\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "NFC2ghIdiZYE",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\n",
        "test_images = test_images.reshape(test_images.shape[0], 28, 28, 1).astype('float32')\n",
        "\n",
        "# Normalizing the images to the range of [0., 1.]\n",
        "train_images /= 255.\n",
        "test_images /= 255.\n",
        "\n",
        "# Binarization\n",
        "train_images[train_images >= .5] = 1.\n",
        "train_images[train_images < .5] = 0.\n",
        "test_images[test_images >= .5] = 1.\n",
        "test_images[test_images < .5] = 0."
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "S4PIDhoDLbsZ",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "TRAIN_BUF = 60000\n",
        "BATCH_SIZE = 100\n",
        "\n",
        "TEST_BUF = 10000"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "PIGN6ouoQxt3"
      },
      "cell_type": "markdown",
      "source": [
        "## Use *tf.data* to create batches and shuffle the dataset"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "-yKCCQOoJ7cn",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(TRAIN_BUF).batch(BATCH_SIZE)\n",
        "test_dataset = tf.data.Dataset.from_tensor_slices(test_images).shuffle(TEST_BUF).batch(BATCH_SIZE)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "THY-sZMiQ4UV"
      },
      "cell_type": "markdown",
      "source": [
        "## Wire up the generative and inference network with *tf.keras.Sequential*\n",
        "\n",
        "In our VAE example, we use two small ConvNets for the generative and inference network. Since these neural nets are small, we use `tf.keras.Sequential` to simplify our code. Let $x$ and $z$ denote the observation and latent variable respectively in the following descriptions. \n",
        "\n",
        "### Generative Network\n",
        "This defines the generative model which takes a latent encoding as input, and outputs the parameters for a conditional distribution of the observation, i.e. $p(x|z)$. Additionally, we use a unit Gaussian prior $p(z)$ for the latent variable.\n",
        "\n",
        "### Inference Network\n",
        "This defines an approximate posterior distribution $q(z|x)$, which takes as input an observation and outputs a set of parameters for the conditional distribution of the latent representation. In this example, we simply model this distribution as a diagonal Gaussian. In this case, the inference network outputs the mean and log-variance parameters of a factorized Gaussian (log-variance instead of the variance directly is for numerical stability).\n",
        "\n",
        "### Reparameterization Trick\n",
        "During optimization, we can sample from $q(z|x)$ by first sampling from a unit Gaussian, and then multiplying by the standard deviation and adding the mean. This ensures the gradients could pass through the sample to the inference network parameters.\n",
        "\n",
        "### Network architecture\n",
        "For the inference network, we use two convolutional layers followed by a fully-connected layer. In the generative network, we mirror this architecture by using a fully-connected layer followed by three convolution transpose layers (a.k.a. deconvolutional layers in some contexts). Note, it's common practice to avoid using batch normalization when training VAEs, since the additional stochasticity due to using mini-batches may aggravate instability on top of the stochasticity from sampling."
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "VGLbvBEmjK0a",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "class CVAE(tf.keras.Model):\n",
        "  def __init__(self, latent_dim):\n",
        "    super(CVAE, self).__init__()\n",
        "    self.latent_dim = latent_dim\n",
        "    self.inference_net = tf.keras.Sequential(\n",
        "      [\n",
        "          tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),\n",
        "          tf.keras.layers.Conv2D(\n",
        "              filters=32, kernel_size=3, strides=(2, 2), activation='relu'),\n",
        "          tf.keras.layers.Conv2D(\n",
        "              filters=64, kernel_size=3, strides=(2, 2), activation='relu'),\n",
        "          tf.keras.layers.Flatten(),\n",
        "          # No activation\n",
        "          tf.keras.layers.Dense(latent_dim + latent_dim),\n",
        "      ]\n",
        "    )\n",
        "\n",
        "    self.generative_net = tf.keras.Sequential(\n",
        "        [\n",
        "          tf.keras.layers.InputLayer(input_shape=(latent_dim,)),\n",
        "          tf.keras.layers.Dense(units=7*7*32, activation=tf.nn.relu),\n",
        "          tf.keras.layers.Reshape(target_shape=(7, 7, 32)),\n",
        "          tf.keras.layers.Conv2DTranspose(\n",
        "              filters=64,\n",
        "              kernel_size=3,\n",
        "              strides=(2, 2),\n",
        "              padding=\"SAME\",\n",
        "              activation='relu'),\n",
        "          tf.keras.layers.Conv2DTranspose(\n",
        "              filters=32,\n",
        "              kernel_size=3,\n",
        "              strides=(2, 2),\n",
        "              padding=\"SAME\",\n",
        "              activation='relu'),\n",
        "          # No activation\n",
        "          tf.keras.layers.Conv2DTranspose(\n",
        "              filters=1, kernel_size=3, strides=(1, 1), padding=\"SAME\"),\n",
        "        ]\n",
        "    )\n",
        "\n",
        "  def sample(self, eps=None):\n",
        "    if eps is None:\n",
        "      eps = tf.random.normal(shape=(100, self.latent_dim))\n",
        "    return self.decode(eps, apply_sigmoid=True)\n",
        "\n",
        "  def encode(self, x):\n",
        "    mean, logvar = tf.split(self.inference_net(x), num_or_size_splits=2, axis=1)\n",
        "    return mean, logvar\n",
        "\n",
        "  def reparameterize(self, mean, logvar):\n",
        "    eps = tf.random.normal(shape=mean.shape)\n",
        "    return eps * tf.exp(logvar * .5) + mean\n",
        "\n",
        "  def decode(self, z, apply_sigmoid=False):\n",
        "    logits = self.generative_net(z)\n",
        "    if apply_sigmoid:\n",
        "      probs = tf.sigmoid(logits)\n",
        "      return probs\n",
        "\n",
        "    return logits"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "0FMYgY_mPfTi"
      },
      "cell_type": "markdown",
      "source": [
        "## Define the loss function and the optimizer\n",
        "\n",
        "VAEs train by maximizing the evidence lower bound (ELBO) on the marginal log-likelihood:\n",
        "\n",
        "$$\\log p(x) \\ge \\text{ELBO} = \\mathbb{E}_{q(z|x)}\\left[\\log \\frac{p(x, z)}{q(z|x)}\\right].$$\n",
        "\n",
        "In practice, we optimize the single sample Monte Carlo estimate of this expectation:\n",
        "\n",
        "$$\\log p(x| z) + \\log p(z) - \\log q(z|x),$$\n",
        "where $z$ is sampled from $q(z|x)$.\n",
        "\n",
        "**Note**: we could also analytically compute the KL term, but here we incorporate all three terms in the Monte Carlo estimator for simplicity."
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "iWCn_PVdEJZ7",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "optimizer = tf.keras.optimizers.Adam(1e-4)\n",
        "\n",
        "def log_normal_pdf(sample, mean, logvar, raxis=1):\n",
        "  log2pi = tf.math.log(2. * np.pi)\n",
        "  return tf.reduce_sum(\n",
        "      -.5 * ((sample - mean) ** 2. * tf.exp(-logvar) + logvar + log2pi),\n",
        "      axis=raxis)\n",
        "\n",
        "def compute_loss(model, x):\n",
        "  mean, logvar = model.encode(x)\n",
        "  z = model.reparameterize(mean, logvar)\n",
        "  x_logit = model.decode(z)\n",
        "\n",
        "  cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)\n",
        "  logpx_z = -tf.reduce_sum(cross_ent, axis=[1, 2, 3])\n",
        "  logpz = log_normal_pdf(z, 0., 0.)\n",
        "  logqz_x = log_normal_pdf(z, mean, logvar)\n",
        "  return -tf.reduce_mean(logpx_z + logpz - logqz_x)\n",
        "\n",
        "def compute_gradients(model, x):\n",
        "  with tf.GradientTape() as tape:\n",
        "    loss = compute_loss(model, x)\n",
        "  return tape.gradient(loss, model.trainable_variables), loss\n",
        "\n",
        "def apply_gradients(optimizer, gradients, variables):\n",
        "  optimizer.apply_gradients(zip(gradients, variables))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "Rw1fkAczTQYh"
      },
      "cell_type": "markdown",
      "source": [
        "## Training\n",
        "\n",
        "* We start by iterating over the dataset\n",
        "* During each iteration, we pass the image to the encoder to obtain a set of mean and log-variance parameters of the approximate posterior $q(z|x)$\n",
        "* We then apply the *reparameterization trick* to sample from $q(z|x)$\n",
        "* Finally, we pass the reparameterized samples to the decoder to obtain the logits of the generative distribution $p(x|z)$\n",
        "* **Note:** Since we use the dataset loaded by keras with 60k datapoints in the training set and 10k datapoints in the test set, our resulting ELBO on the test set is slightly higher than reported results in the literature which uses dynamic binarization of Larochelle's MNIST.\n",
        "\n",
        "## Generate Images\n",
        "\n",
        "* After training, it is time to generate some images\n",
        "* We start by sampling a set of latent vectors from the unit Gaussian prior distribution $p(z)$\n",
        "* The generator will then convert the latent sample $z$ to logits of the observation, giving a distribution $p(x|z)$\n",
        "* Here we plot the probabilities of Bernoulli distributions\n"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "NS2GWywBbAWo",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "epochs = 100\n",
        "latent_dim = 50\n",
        "num_examples_to_generate = 16\n",
        "\n",
        "# keeping the random vector constant for generation (prediction) so\n",
        "# it will be easier to see the improvement.\n",
        "random_vector_for_generation = tf.random.normal(\n",
        "    shape=[num_examples_to_generate, latent_dim])\n",
        "model = CVAE(latent_dim)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "RmdVsmvhPxyy",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def generate_and_save_images(model, epoch, test_input):\n",
        "  predictions = model.sample(test_input)\n",
        "  fig = plt.figure(figsize=(4,4))\n",
        "\n",
        "  for i in range(predictions.shape[0]):\n",
        "      plt.subplot(4, 4, i+1)\n",
        "      plt.imshow(predictions[i, :, :, 0], cmap='gray')\n",
        "      plt.axis('off')\n",
        "\n",
        "  # tight_layout minimizes the overlap between 2 sub-plots\n",
        "  plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))\n",
        "  plt.show()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "2M7LmLtGEMQJ",
        "outputId": "c077e07a-6f4e-4c6c-f9c9-f78e5dc72704",
        "colab": {
          "height": 296
        }
      },
      "cell_type": "code",
      "source": [
        "generate_and_save_images(model, 0, random_vector_for_generation)\n",
        "\n",
        "for epoch in range(1, epochs + 1):\n",
        "  start_time = time.time()\n",
        "  for train_x in train_dataset:\n",
        "    gradients, loss = compute_gradients(model, train_x)\n",
        "    apply_gradients(optimizer, gradients, model.trainable_variables)\n",
        "  end_time = time.time()\n",
        "\n",
        "  if epoch % 1 == 0:\n",
        "    loss = tf.keras.metrics.Mean()\n",
        "    for test_x in test_dataset:\n",
        "      loss(compute_loss(model, test_x))\n",
        "    elbo = -loss.result()\n",
        "    display.clear_output(wait=False)\n",
        "    print('Epoch: {}, Test set ELBO: {}, '\n",
        "          'time elapse for current epoch {}'.format(epoch,\n",
        "                                                    elbo,\n",
        "                                                    end_time - start_time))\n",
        "    generate_and_save_images(\n",
        "        model, epoch, random_vector_for_generation)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch: 100, Test set ELBO: -78.3382263184, time elapse for current epoch 13.2003290653\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nrkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f822087cc90>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "P4M_vIbUi7c0"
      },
      "cell_type": "markdown",
      "source": [
        "### Display an image using the epoch number"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "WfO5wCdclHGL",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def display_image(epoch_no):\n",
        "  return PIL.Image.open('image_at_epoch_{:04d}.png'.format(epoch_no))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "5x3q9_Oe5q0A",
        "outputId": "ec7a93bb-dc84-4b7c-c83b-b39cd2bc94b1",
        "colab": {
          "height": 297
        }
      },
      "cell_type": "code",
      "source": [
        "plt.imshow(display_image(epochs))\n",
        "plt.axis('off')# Display images"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(-0.5, 287.5, 287.5, -0.5)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 0
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f821fd12110>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "NywiH3nL8guF"
      },
      "cell_type": "markdown",
      "source": [
        "### Generate a GIF of all the saved images."
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "IGKQgENQ8lEI",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "with imageio.get_writer('cvae.gif', mode='I') as writer:\n",
        "  filenames = glob.glob('image*.png')\n",
        "  filenames = sorted(filenames)\n",
        "  last = -1\n",
        "  for i,filename in enumerate(filenames):\n",
        "    frame = 2*(i**0.5)\n",
        "    if round(frame) > round(last):\n",
        "      last = frame\n",
        "    else:\n",
        "      continue\n",
        "    image = imageio.imread(filename)\n",
        "    writer.append_data(image)\n",
        "  image = imageio.imread(filename)\n",
        "  writer.append_data(image)\n",
        "    \n",
        "# this is a hack to display the gif inside the notebook\n",
        "os.system('cp cvae.gif cvae.gif.png')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "uV0yiKpzNP1b",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "display.Image(filename=\"cvae.gif.png\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "yQXO_dlXkKsT"
      },
      "cell_type": "markdown",
      "source": [
        "To downlod the animation from Colab uncomment the code below:"
      ]
    },
    {
      "metadata": {
        "colab_type": "code",
        "id": "4fSJS3m5HLFM",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "#from google.colab import files\n",
        "#files.download('cvae.gif')"
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}